package com.smart.lx.singleton.lazy;

/**
 * 功能描述: <br>
 * 〈懒汉式简单〉
 * <p>
 * 内部类注册
 *
 * @since: 1.0.0
 * @Author:abc
 * @Date: 2019/3/10
 */


//这种形式兼顾饿汉式的内存浪费，也兼顾synchronized性能问题
//完美地屏蔽了这两个缺点
//史上最牛B的单例模式的实现方式
public class LazyInnerClassSing {
    private boolean initialized = false;

    //默认使用LazyThree的时候，会先初始化内部类
    //如果没使用的话，内部类是不加载的

    private LazyInnerClassSing(){

        synchronized (LazyInnerClassSing.class){
            System.out.println("---3333------");
            if(initialized == false){
                System.out.println("---4444------");
                initialized = !initialized;
            }else{
                System.out.println("---555-----");
                throw new RuntimeException("不允许创建多个单例");
            }
        }

    }


    //每一个关键字都不是多余的
    //static 是为了使单例的空间共享
    //final 保证这个方法不会被重写，重载
    public static final LazyInnerClassSing getInstance(){
        //在返回结果以前，一定会先加载内部类
        System.out.println("---2222------");
        return LazyHolder.LAZY;
    }


    //默认不加载
    private static class LazyHolder{

        private static final LazyInnerClassSing LAZY = new LazyInnerClassSing();

    }
}
